package cn.zhuama.common.service;


import cn.zhuama.basic.exception.BusinessException;
import cn.zhuama.basic.util.SmsUtils;
import cn.zhuama.basic.util.StrUtils;
import cn.zhuama.common.domain.SmsDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import java.util.concurrent.TimeUnit;

@Service
@Transactional(readOnly = true,propagation = Propagation.SUPPORTS)
public class BindphoneService {
    @Autowired
    RedisTemplate redisTemplate;

    public void binderSmsCode(SmsDto smsDto) {
        //参数检验查看是否有手机号
        String phone = smsDto.getPhone();
        if(StringUtils.isEmpty(phone)){
            throw new BusinessException("手机号码不能为空!!!");
        }
        //获取手机验证码 判断过期没得 没过期
        //文档思路呢就是先看这个有没有 在进行查
        //这里可以前面直接建个 常量库 用于区分
        Object redisSmsCode = redisTemplate.opsForValue().get("bind"+phone);
        String code = null;
        if(redisSmsCode == null){
            //第一次发送 or 手机验证码过期了
            //过期了就用新的验证码 redis中没得就是
            code = StrUtils.getRandomString(4);
        }else{//没有过期
            //验证是否过了重发时间
            //以前保存的时间
            long redisTime = Long.parseLong(redisSmsCode.toString().split(":")[1]);
            //现在的时间
            long nowTime = System.currentTimeMillis();
            //这两个代码意思相同
            //6.没有过期 - 判断是否过了重发时间
            if((nowTime-redisTime)<1*60*1000){//没有过重发时间
                System.out.println(code);
                throw new BusinessException("请勿重复获取验证码!!!");
            }
//            //也可以直接用剩余时间看 存个几分钟
//            long restime = redisTemplate.getExpire("bind"+phone);
//            //根据这个剩余时间 查看是否过了重发时间
//            if(restime>0){
//                throw new BusinessException("请勿重复获取验证码!!!");
//            }   个人写的我觉得是对的 他的思路应该是在redis中存的是验证码+时间来进行判断 好像没我这个简单
              else{
                //没有过期就用以前的验证码
                code = redisSmsCode.toString().split(":")[0];
                //code = (String) redisTemplate.opsForValue().get("bind"+phone); 同理一样的
            }
        }
        //果然是这样的
        //7.将验证码存入redis：【register:18725556563 - 9527:1233555555】
        //刷新了过期时间
        redisTemplate.opsForValue().set("bind" + phone,code+":"+System.currentTimeMillis(),3, TimeUnit.MINUTES);
        //个人觉得可以直接存一个code 然后时效三分钟 不需要他这样 用code+当前时间 不过这样好理解
        //8.调用SmsUtils发送短信
        SmsUtils.sendSms(phone,"手机验证码为：" + code + ",请在3分钟内使用!!!");
        System.out.println(code);
        System.out.println("手机验证码为：" + code + ",请在3分钟内使用!!!");
    }

}

